package com.ssy.lingxi.component.redis.service;

import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * IRedisUtils接口(用于存储字符串类型数据, 存储之前不会进行序列化)
 * @author jw.chen
 * @date 2020-08-01
 */
@Service
public interface IRedisStringUtils {

    /**
     * 保存数据
     *
     * @param key      key值
     * @param value    value值
     * @param db_index redis数据库下标
     * @return 保存结果
     */
    Boolean set(String key, String value, Integer db_index);

    /**
     * 保存数据并设置超时时间
     *
     * @param key      key值
     * @param value    value值
     * @param expire   超时时间，单位 秒
     * @param db_index redis数据库下标
     * @return 保存结果
     */
    Boolean set(String key, String value, Long expire, Integer db_index);

    /**
     * 获取key对应的值
     *
     * @param key      key值
     * @param db_index redis数据库下标
     * @return 保存结果
     */
    String get(String key, Integer db_index);

    /**
     * 删除指定的key
     *
     * @param key      key值
     * @param db_index redis数据库下标
     */
    Long del(String key, Integer db_index);

    /**
     * 删除以keyPrex为前缀的数据
     *
     * @param keyPrex  key值
     * @param db_index redis数据库下标
     */
    Long delByPrex(String keyPrex, Integer db_index);

    /**
     * 删除指定的key
     *
     * @param keys     keys值
     * @param db_index redis数据库下标
     */
    Long del(List<String> keys, Integer db_index);

    /**
     * 以秒为单位，返回给定key的剩余生存时间
     *
     * @param key      key值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    Long ttl(String key, Integer db_index);

    /**
     * 判断key是否存在
     *
     * @param key      key值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    Boolean exists(String key, Integer db_index);

    /**
     * 判断存在多少个key
     *
     * @param keys     keys值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    Long exists(List<String> keys, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key
     *
     * @param key      KEYS * 匹配数据库中所有 key 。
     *                 KEYS h?llo 匹配 hello ， hallo 和 hxllo 等。
     *                 KEYS h*llo 匹配 hllo 和 heeeeello 等。
     *                 KEYS h[ae]llo 匹配 hello 和 hallo ，但不匹配 hillo
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    List<String> searchKey(String key, Integer db_index);

    /**
     * 查找所有符合给定模式 pattern 的 key
     *
     * @param keyList KEYS * 匹配数据库中所有 key 。
     *            KEYS h?llo 匹配 hello ， hallo 和 hxllo 等。
     *            KEYS h*llo 匹配 hllo 和 heeeeello 等。
     *            KEYS h[ae]llo 匹配 hello 和 hallo ，但不匹配 hillo
     * @return 查询结果
     */
    List<Object> searchKeyList(List<String> keyList, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key
     *
     * @param key      key scan match * 匹配数据库中所有 key
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    Set<String> scanKey(String key, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key个数
     *
     * @param key      KEYS * 匹配数据库中所有 key 。
     *                 KEYS h?llo 匹配 hello ， hallo 和 hxllo 等。
     *                 KEYS h*llo 匹配 hllo 和 heeeeello 等。
     *                 KEYS h[ae]llo 匹配 hello 和 hallo ，但不匹配 hillo
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    int size(String key, Integer db_index);

    /**
     * 递增1
     *
     * @param key      key值
     * @param db_index redis数据库下标
     */
    Long increment(String key, Integer db_index);

    /**
     * 递增1
     *
     * @param key      key值
     * @param db_index redis数据库下标
     * @param seconds  超时秒数
     */
    Long increment(String key, Integer db_index, long seconds);

    /**
     * 递增
     *
     * @param key      key值
     * @param data     累加值
     * @param db_index redis数据库下标
     */
    Long increment(String key, long data, Integer db_index);

    /**
     * 递增
     *
     * @param key      key值
     * @param data     累加值
     * @param db_index redis数据库下标
     */
    Double increment(String key, double data, Integer db_index);

    /**
     * 递减1
     *
     * @param key      key值
     * @param db_index redis数据库下标
     */
    Long decrement(String key, Integer db_index);

    /**
     * 递减
     *
     * @param key      key值
     * @param data     累加值
     * @param db_index redis数据库下标
     */
    Long decrement(String key, long data, Integer db_index);

    /**
     * 保存数据
     *
     * @param key      key值
     * @param field    field值
     * @param value    value值
     * @param db_index redis数据库下标
     * @return 保存结果
     */
    Boolean hSet(String key, String field, String value, Integer db_index);

    /**
     * 保存数据并设置超时时间
     *
     * @param key      key值
     * @param field    field值
     * @param value    value值
     * @param expire   超时时间，单位 秒
     * @param db_index redis数据库下标
     * @return 保存结果
     */
    Boolean hSet(String key, String field, String value, Long expire, Integer db_index);

    /**
     * 获取key对应的值
     *
     * @param key      key值
     * @param field    field值
     * @param db_index redis数据库下标
     * @return 获取结果
     */
    String hGet(String key, String field, Integer db_index);

    /**
     * 保存数据
     *
     * @param key      key值
     * @param value    value值
     * @param db_index redis数据库下标
     * @return 保存结果
     */
    Boolean hMSet(String key, Map<String, String> value, Integer db_index);

    /**
     * 批量设置
     *
     * @param keyValueList key和value值集合
     * @param db_index     redis数据库下标
     */
    void hMSetBatch(List<HashMap<String, Map<String, String>>> keyValueList, Integer db_index);

    /**
     * 批量设置
     *
     * @param keyValueMap key和value值集合
     * @param db_index    redis数据库下标
     */
    void hMSetBatch(HashMap<String, Map<String, String>> keyValueMap, Integer db_index);

    /**
     * 保存数据并设置超时时间
     *
     * @param key      key值
     * @param value    value值
     * @param expire   超时时间，单位 秒
     * @param db_index redis数据库下标
     * @return 保存结果
     */
    Boolean hMSet(String key, Map<String, String> value, Long expire, Integer db_index);

    /**
     * 获取key对应的值
     *
     * @param key      key值
     * @param fields   fields值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    List<String> hMGet(String key, String[] fields, Integer db_index);

    /**
     * 获取key对应的值
     *
     * @param key      key值
     * @param field    field值
     * @param db_index redis数据库下标
     * @return 获取结果
     */
    String hMGet(String key, String field, Integer db_index);

    /**
     * 获取key对应的值
     *
     * @param keyFieldList key和field值集合
     * @param db_index     redis数据库下标
     * @return 获取结果
     */
    List<Object> hMGetBatch(List<HashMap<String, String[]>> keyFieldList, Integer db_index);

    /**
     * 获取key对应的值
     *
     * @param keyFieldMap key和field值集合
     * @param db_index     redis数据库下标
     * @return 获取结果
     */
    List<Object> hMGetBatch(HashMap<String, String[]> keyFieldMap, Integer db_index);

    /**
     * 获取key对应的值
     *
     * @param key      key值
     * @param db_index redis数据库下标
     * @return 获取结果
     */
    Map<String, String> hGetAll(String key, Integer db_index);

    /**
     * 删除指定的key
     *
     * @param key      key值
     * @param field    field值
     * @param db_index redis数据库下标
     */
    Long hDel(String key, String field, Integer db_index);

    /**
     * 删除指定的key
     *
     * @param key      key值
     * @param fields   keys值
     * @param db_index redis数据库下标
     */
    Long hDel(String key, List<String> fields, Integer db_index);

    /**
     * 判断key是否存在
     *
     * @param key      key值
     * @param field    field值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    Boolean hExists(String key, String field, Integer db_index);

    /**
     * 判断存在多少个fields
     *
     * @param key      key值
     * @param fields   fields值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    Long hExists(String key, List<String> fields, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key中的所有field
     *
     * @param key Key值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    List<String> searchHKey(String key, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key中的所有field个数
     *
     * @param key Key值
     * @param db_index redis数据库下标
     * @return 查询结果
     */
    int hSize(String key, Integer db_index);

    /**
     * 递增1
     *
     * @param key      key值
     * @param field    field值
     * @param db_index redis数据库下标
     */
    Long hIncrement(String key, String field, Integer db_index);

    /**
     * 递增
     *
     * @param key      key值
     * @param field    field值
     * @param data     累加值
     * @param db_index redis数据库下标
     */
    Long hIncrement(String key, String field, long data, Integer db_index);

    /**
     * 递增
     *
     * @param key      key值
     * @param field    field值
     * @param data     累加值
     * @param db_index redis数据库下标
     */
    Double hIncrement(String key, String field, double data, Integer db_index);

    /**
     * 递减1
     *
     * @param key      key值
     * @param field    field值
     * @param db_index redis数据库下标
     */
    Long hDecrement(String key, String field, Integer db_index);

    /**
     * 递减
     *
     * @param key      key值
     * @param field    field值
     * @param data     累加值
     * @param db_index redis数据库下标
     */
    Long hDecrement(String key, String field, long data, Integer db_index);

    /**
     * 根据key 和 起始和结束下标获取 zset的数据集合
     *
     * @param key        集合key
     * @param startIndex 开始下标
     * @param endIndex   结束下标
     * @author wrc
     */
    Set<String> getZSet(String key, Integer startIndex, Integer endIndex);
    /**
     * 根据key获取 zset的数据集合大小
     *
     * @param key        集合key
     * @author wrc
     */
    Long getZSetSize(String key);

    /**
     * 根据key 和 起始和结束下标获取 zset的数据集合
     * 并且返回分数
     * @param key        集合key
     * @param startIndex 开始下标
     * @param endIndex   结束下标
     * @author wrc
     */
    Map<String,Double>  rangeWithScores(String key, Integer startIndex, Integer endIndex);

    /**
     * 根据key 和 起始和结束下标获取 zset的数据集合[根据score顺序]
     * @param key
     * @param startIndex
     * @param endIndex
     * @return
     */
    List<Map<String,Double>> rangeWithScoresOrderByScore(String key, Integer startIndex, Integer endIndex);

    /**
     * 根据key 和 起始和结束下标获取 zset的Key集合[根据score顺序]
     * @param key
     * @param startIndex
     * @param endIndex
     * @return
     */
    List<String> rangeKeysOrderByScore(String key, Integer startIndex, Integer endIndex);

    /**
     * 添加元素到zset中去
     */
    Boolean addZSet(String key, String value, Double score);

    /**
     * 单个删除zset中的元素
     * @param key
     * @param value
     * @return
     */
    Long removeZSet(String key,String value);

    /**
    * 批量添加元素到zset中去
    * @author wrc
    * @date 2021/4/29
    */
    Long batchAddZSet(String key, Map<String,Double> map);

    /**
     *根据key获取zset中元素的排名
     */
     Long findZSet(String key, String value);

    /**
     *根据key获取zset中元素的分数
     */
    Double score(String key, String value);

    /**
     * 获取优惠券数量
     * 扩展一个获取数量的方法, 保持和以下方法为同一个库
     * @see #executeCouponQuantityScript
     * @param key key
     * @return 返回结果
     */
    String getCouponQuantityScript(String key);

    /**
     * 执行优惠券数量脚本
     * 没时间改别人代码, 直接写在这,
     * 其他人引一个component-service-redis,
     * 就不能引入spring-data-redis, 以致于冲突
     * @param key key
     * @param quantity 数量
     * @return 返回结果
     */
    String executeCouponQuantityScript(String key, Integer quantity);

}
